HTTP (HyperText Transport Protocol)의 이해
웹 개발자라면 당연히 HTTP를 잘 이해하고 있어야 한다.
1. HTTP(HyperText Transport Protocol) 개요
1.1 HTTP 란?
- HTTP란 HyperText Transport Protocol의 약자로 웹서버와 클라이언트간의 문서를 교환하기 위한 통신규약이다.
- World Wide Web( WWW )의 분산되어 있는 Server와 Client 간에 Hypertext를 이용한 정보교환이 가능하도록 하는 통신 규약이다.
- 1989년 Tim Berners Lee가 처음 설계
- HTTP는 웹에서만 사용하는 Protocol로 TCP/IP 기반으로 한 지점에서 다른 지점(보통 클라이언트와 서버)으로 요청과 응답을 전송한다.
1.2 HTTP의 특징
- HTTP 메시지는 HTTP Server와 HTTP Client에 의해서 해석
- TCP/IP 프로토콜의 Application 계층에 위치
- TCP Protocol을 이용한다( Default Port 80 )
- 현재 Version 1.1 ( RFC 2616 )
2. HTTP 1.1
2.1 HTTP 1.0의 문제점
- 단순한 OPEN,OPERAIOTN,CLOSE
- 매번 필요할 때마다 연결(비 지속성 연결방식) → 성능의 저하
- 한번에 얻어서 가져올 수 있는 데이터의 양이 제한
- URL의 크기도 작으며, 캐시 기능이 미흡함(Last-Modified에 의존)
- GET/HEAD/POST method만 허용
2.2 HTTP 1.1의 개선
- 지속적인 연결을 해 주는 persistent connection 지원
- multiple request 처리 가능
- request/response가 pipeline 방식으로 진행
- proxy server와 캐시 기능 향상(Cache-Control)
- GET,HEAD,POST,OPTIONS,DELETE,TRACE,CONNET 메소드 허용
파이프라이닝( Pipe Lining ) 이란?
- 응답 메시지가 도착하지 않은 상태에서 연속적인 요구 메시지를 서버에 전달
- 이때 서버는 요구메시지를 수신한 순서대로 응답메시지를 클라이언트에 전달
- 연결과 종료횟수를 줄임으로서 네트워크 자원의 절약
- 발생하는 패킷의 숫자를 감소, 네트워크 트래픽 감소
3. HTTP Message
- Message 종류
- Request : 요청 Message ( Client → Server )
- Response : 응답 Message ( Server → Client )
- Header Field Definitions
- 클라이언트와 서버 사이에서 부가적인 정보 교환
- General headers, Request headers, Response headers, Entity headers가 있음
- 헤더명, 콜런, 공백, 헤더값 형식 (Header Name: Header Value)
- Request Message와 Reponse Message 구조
- 메시지에 대한 일반적인 정보 제공
- Request Message와 Reponse Message 모두 사용 될 수 있다..
| Header | 설명 | 예 |
|---|
| Connection | Connection 옵션지정 | Connection: close |
| Date | 메세지가 작성된 일시 | Date: Wed, 05 May 2010 17:27:50 GMT |
| Cache-Control | cache사용을 막을것인지 허용할것인지를 제어함. | - Cache Request 지시문
- no-cache : 캐시 하지 않는다. cache서버, proxy서버, 브라우져에 cache하지 말도록 지시함.
- no-store : 신속히 넘긴 후에 정보를 제거한다.
- max-age = seconds : seconds에 지정한 것보다 오래된 응답은 보내지 않는다.
- max-stale =seconds : 만료된 데이터를 보낸다. 만약 seconds가 지정되어 있다면 지정한 숫자보다 적은 만료된 데이터를 보낸다.
- min-fresh = seconds : 명시된 seconds의 수 이후의 변경된 새 데이터만 보낸다.
- only-if-cached : 새로운 데이터를 검색하지 않고 캐시에 있는 데이터만 반환한다.
- Cache Response 지시문
- public : 어떠한 캐시라도 캐시할수 있다.
- private : 공유된 캐시는 캐시하지 않는다.
- no-cache : 캐시하지 않는다.
- no-transform : 데이터를 변환하지 않는다.
- must-revalidate : 클라이언트는 데이터를 재확인 해야 한다.
- proxy-revalidate : 개인적인 클라이언트 캐시를 제외하고 데이터를 재확인 해야한다.
- max-age=seconds : 문서는 지정된 seconds만큼만 변화가 없는 상태라고 생각
- 클라이언트의 구성과 문서 형식을 지정
- Request Message만 존재
| Header | 설명 | 예 |
|---|
| Accept | 클라이언트가 받아들이는 미디어 타입 | Accept: text/javascript, text/html, application/xml, text/xml, / |
| Accept-Charset | 클라이언트가 다루는 문자열 ? 지정 | Accept-Charset: windows-949,utf-8;q=0.7,*;q=0.3 |
| Accept-Language | 클라이언트가 받아들일 언어 | Accept-Language: ko-KR |
| Host | 호스트의 주소와 포트 번호 | Host: www.gurubee.net |
| User-Agent | 클라이언트 프로그램( 웹 브라우저)을 표시 | User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1 |
| If-Modified-Since | | |
| Referer | | |
| If-Match | | |
| If-None-Match | | |
| If-Range | | |
| If-Unmodified-Since | | |
| Max-Forwards | | |
- 서버의 구성과 요청에 대한 특별한 정보를 지정
- Reponse Message만 존재
| Header | 설명 | 예 |
|---|
| Server | HTTP Server 정보 | Server: Apache |
| Accept-Ranges | | |
| Age | | |
| ETag | | |
- 문서의 본문에 대한 정보 제공
- Request Message와 Reponse Message 모두 존재한다.
| Header | 설명 | 예 |
|---|
| Content-Length | 응답되는 컨텐츠의 사이즈 | Content-Length: 3495 |
| Content-Type | 응답되는 컨텐츠의 유형 | Content-Type: text/html; charset=UTF-8 |
| Expires | Cache가 초기화 되는 시간 | Expires: Thu, 01 Dec 1994 16:00:00 GMT |
| Last-Modified | 응답되는 컨텐츠가 마지막으로 수정될 일시 | Last-Modified: Tue, 15 Nov 1994 12:45:26 GMT |
| Content-Range | | |
| Content-Location | | |
| Content-Language | | |
3.2 HTTP Request Message
| Request Message | 설명 |
|---|
| GET /home/newRelease.nhn HTTP/1.1 | Reqeust Line (HTTP method(GET, POST, HEAD, TRACE...), URL, HTTP 버전 정보를 알 수있다.) |
Accept: / Accept-Language: ko-KR Referer: / x-flash-version: 10,2,159,1 Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1.. Host: www.gurubee.net Connection: Keep-Alive Cookie: JSESSIONID=286C75937E048B54850657F5203532ED; | Headers |
3.2.2 HTTP method
- GET
- URL에 해당하는 정보의 전송요청
- 데이터의 전달 : 이름과 값을 쌍으로. ex) name=value
- 데이터의 구분 : & 사용. ex) name1=value1&name2=value2)
- 데이터가 URL에 노출
- 인코딩/디코딩의 과정이 없기 때문에 POST보다 빠르다
- URL의 길이 제약으로 인해 많은 데이터 전송은 무리
- POST
- 폼에서 POST 지정하는 경우
- 데이터는 HTTP Boby에 숨겨서 서버로 전송
- GET으로 보낼수 없는 자료를 전송할때 사용 가능
- HEAD
- GET과 동일하나 HTTP Header 정보만 요청
- 네트워크 대역을 절약, 리소스의 크기확인시 사용
- OPTIONS
- 어떤 HTTP 메소드를 지원하는 지 검사
- 요청한 URL에 어떤 메소드 요청이 가능한지 확인
- 보안적으로 위험, 헤커들에게 중요한 정보를 제공하게 된다. 비활성화
- PUT
- URI로 지정한 서버에 있는 파일을 대치한다.
- URI로 지정한 파일이 없는 경우는 파일을 새로 작성한다.
- 보안적으로 위험, 비활성화 시킨다.
- DELETE
- URI로 지정한 서버에 있는 파일을 삭제한다
- 보안적으로 위험, 비활성화
- TRACE
- 서버측에서 받은 리퀘스트 라인과 헤더를 그대로 클라이언트로 반송한다.
- 프록시 서버 등을 쓰는 환경에서 리퀘스트가 바뀌어 써지는 모양을 살펴볼 때 사용한다.
- Request의 Loopback 테스트용으로 사용 할 수 있다.
- CONNECT
- 터널링의 목적으로 연결요청
- Forward Proxy에 HTTP TLS (Transport Layer Security) 터널링 (Tunnelling)을 요청할 때 사용
<Directory /home>
<LimitExcept GET POST>
Order deny,allow
Deny from all
</LimitExcept>
</Directory>
3.3 HTTP Response Message
| Request Message | 설명 |
|---|
| HTTP/1.1 200 OK | Status Line |
Last-Modified: Wed, 05 May 2010 17:27:50 GMT Content-Length: 1251273 Cache-Control: max-age=604800 Content-Type: text/html; charset=UTF-8 Expires: Sun, 05 Jun 2011 06:25:47 GMT | Headers |
3.3.2 HTTP Status Code
| Status Code | Message | 설명 |
|---|
| 200 | OK | 모든 것이 정상 |
| 204 | No Content | 요구가 처리되었으나 클라이언트에게 전달할 문서 없음. 브라우저는 이전 문서를 계속 보여줘야 한다. |
| 206 | Partial Content | Range 헤더 지정 요청에 응답하는 데 이용된다. 서버는 반드시 Content-Range 헤더와 응답에 포함된 범위를 지정해야 한다.  |
| 304 | Not Modified | 변경 없음 |
| 400 | Bad Request | 잘못된 요청 |
| 403 | Forbidden | 접근권한 없음 |
| 404 | Not Found | 요청한 내용이나 파일을 찾을 수 없음 |
| 408 | Request Timeout | 클라이언트가 요청을 보내는 데 너무 오랜 시간이 걸림. |
| 414 | Request URI Too Long | URI가 너무 길어 오류 발생 |
| 500 | Internal Server Error | 서버 에러 |
| 503 | Service Unavailable | 서버 한계 초과 등의 오류 |
참고자료